var http = require('http');
var net = require('net');
var url = require('url');

/**
 **在本地 8888 端口开启 HTTP 代理服务，
 **这个服务从 CONNECT 请求报文中解析出域名和端口，
 **创建到服务端的 TCP 连接，并和 CONNECT 请求中的 TCP 连接串起来，
 **最后再响应一个 Connection Established 响应。
 **修改浏览器的 HTTP 代理为 127.0.0.1:8888 后再访问 HTTPS 网站，代理可以正常工作
 **/

function request(cReq, cRes) {
	var u = url.parse(cReq.url);
	var options = {
		hostname: u.hostname,
		port: u.port || 80,
		path: u.path,
		method: cReq.method,
		headers: cReq.headers
	};
	var pReq = http.request(options, function(pRes) {
		cRes.writeHead(pRes.statusCode, pRes.headers);
		pRes.pipe(cRes);
	}).on('error', function(e) {
		cRes.end();
	});
	cReq.pipe(pReq);
}

function connect(cReq, cSock) {
	var u = url.parse('http://' + cReq.url);
	var pSock = net.connect(u.port, u.hostname, function() {
		cSock.write('HTTP/1.1 200 Connection Established\r\n\r\n');
		pSock.pipe(cSock);
	}).on('error', function(e) {
		cSock.end();
	});
	cSock.pipe(pSock);
}

http.createServer().on('request', request).on('connect', connect).listen(8888, '0.0.0.0');